package Day11;

import java.util.Random;
import java.util.concurrent.locks.ReentrantLock;

//创建一个Java程序，其中定义一个共享的银行账户类`BankAccount`，
//该类有一个余额成员变量`balance`和两个方法：`deposit(int amount)`用于存款，
//`withdraw(int amount)`用于取款。创建多个线程，每个线程代表一个用户，随机
//对账户进行存款和取款操作。使用Lock锁确保账户余额的更新是线程安全的，并打印出每次操作后的账户余额。
//提示：
//- 在`BankAccount`类的`deposit`和`withdraw`方法上使用`synchronized`关键字来确保同一时间只有一个线程可以访问这些方法。
//- 创建多个线程，每个线程在循环中随机选择存款或取款操作，并调用相应的同步方法
public class BankAccount {
    double balance = 10000;//余额
    ReentrantLock lock = new ReentrantLock();
    public void deposit(int amount){//存款
        String name = Thread.currentThread().getName();
        lock.lock();//加锁
        balance += amount;
        System.out.println(name + " 存储了: " + amount + "余额:" + balance);
        lock.unlock();//释放锁
    }
    public void withdraw(int amount){//取款
        String name = Thread.currentThread().getName();
        lock.lock();//加锁
        if (amount > 0 && amount < balance) {
            balance -= amount;
            System.out.println(name + " 取出了: " + amount + "余额:" + balance);
        } else {
            System.out.println(name + " 要取出: " + amount + "但是余额不足");
        }
        lock.unlock();//释放锁
    }

    public static void main(String[] args) {
        BankAccount bc = new BankAccount();
        Random random = new Random();
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                for (int j = 0; j < 10; j++) {
                    if (random.nextInt(2) == 0) {
                        bc.withdraw((random.nextInt(100) + 1) * 100);
                    } else {
                        bc.deposit((random.nextInt(100) + 1) * 100);
                    }
                }
            }, "" + i).start();
        }
    }
}
